/*->c.vxsend */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>

#include "h.os"
#include "h.wimp"
#include "h.bbc"
#include "h.flex"


#include "h.wos"
#include "h.main"
#include "h.ram"
#include "h.mym"
#include "h.def"


#include "h.serial"
#include "h.term"
#include "h.pr"
#include "h.script"

#include "h.vxdef"
#include "h.vxwimp"
#include "h.vxkey"
#include "h.vxterm"
#include "h.vxedit"
#include "h.vxkey"


#include "h.vxsend"



/***************************************************************************/
/*
 Code to send Viewdata frames
*/
/*****************************************************************************/


static int sendframe;                /* flag to spot cancel being hit */
int        sendsactive;


void sendframeicon(void)
{
 if(icon==0) sendframe=0;
}




static void fgrab(int time)
{
 int j;
 time+=clock();
 while((clock()<time) && sendframe)
 {
  tty(j=getbyte());
  if(j!=-1) time=clock()+25;
  if(scriptpoll) pollzt();
 }
}


static void xfgrab(int time)
{
 int j;
 int delta;

 if(time) delta=1;
 else     delta=0;

 time+=clock();

 do
 {
  tty(j=getbyte());
  if(j!=-1) time=clock()+delta;
  if(scriptpoll) pollzt();
 } while((clock()<time) && sendframe);

}


static void fequal(int x,int y)
{
 int time;
 int delta;

 if(vxechopace) delta=250; 
 else           delta=0;

 time=clock()+delta;

 while((clock()<time) && sendframe && !(ttvx==x && ttvy==y) && !(ttvy>y))
 {
  tty(getbyte());
  if(scriptpoll) pollzt();
 }
}


static void sendchar(int byte)
{ 
 int time;
 int i;
 int j;
 int shift;

 if(byte>159) byte-=128;

 do
 {
  if(vxescseq && byte=='@') viewconvertstringline(vxatseq);
  else
  if(vxescseq && byte=='*') viewconvertstringline(vxaseq);
  else                      viewline(byte);

  if(!vxechocheck)
  {
   xfgrab(vxechopace);
   break;
  }

  i=-1;
  time=clock()+400;
  shift=0;
  while((clock()<time) && sendframe)
  {
   j=getbyte();
   if(j!=-1)
   {
    j&=0x7F;
    if(j==0);
    else
    if(j==27) shift=64;
    else
    {
     i=j+shift;
     break;
    }
   }
   if(scriptpoll) pollzt();
  }

  if(i!=-1) viewhi(i);
  fgrab(5);
  if(i==byte) break;
  if(i==9 && byte==32) break;
  if(i!=-1)
  {
   viewline(8);
   fgrab(250);
  }
 } while(sendframe);
}


void setechopace(void)
{
 if(sscanf(vxechopacestring,"%d",&vxechopace)!=1) vxechopace=0;

 if(vxechopace>99) vxechopace=99;
 else
 if(vxechopace<0)  vxechopace=0;
}




/* send current frame */

void sendscreen(void)
{                                       
 int fullmode;
 int oy;
 int oc;
 int sx;
 int etx;
 int ety;
 int tempe;
 int wretx=-1;
 int wrety=-1;
 int handle;

 if(sendsactive) return;
 sendsactive=1;

 handle=createwindow(SENDFRAME);
 if(!handle) return;

 setechopace();

 viewconvertstringline(vxprefix);

 popup(handle,0);

 fullmode=(ttvx==0 && (ttvy==0 || ttvy==1));
 sendframe=1;

 if(!fullmode)
 {
  viewline(9);
  fgrab(25);
  viewline(8);
  fgrab(25);
  fgrab(50);
 }

 etx=ttvx;
 oy=ety=ttvy;

 do
 {
  if(vxechocheck || vxechopace>5 || etx==0 || etx==10 || etx==20 || etx==30)
  {
   if(ety!=wrety) 
   {
    writeiconf(handle,2,"%d",ety);
    wrety=ety;
   }
   if(etx!=wretx)
   {
    writeiconf(handle,4,"%d",etx);
    wretx=etx;
   }
  }

  if(vxshortlines)
  {
   for(sx=etx;sx<40;sx++) if(vscr->tcbuf[ety][sx]!=32)
      {/* dprintf(0,"byte=%d",vscr->tcbuf[ety][sx]); */ break;}
  }
  else sx=-1;

  if(sx==40 || vscr->attr[ety]==VXADHB)   /* this is a short line or null */
  {
   if(etx==0)
   {
    viewline(10);
    if(++ety==24) ety=0;
   }
   else 
   if(vxescseq) 
   {
    viewconvertstringline(vxsolseq);
    etx=0;
    if(++ety==24)
    ety=0;
   }
   else
   {
    for(sx=etx;sx<40;sx++)
    {
     viewline(9);
     fgrab(20);
    }
    etx=0;
    if(++ety==24) ety=0;
   }

   if(!vxechocheck) fequal(etx,ety);
   else             fgrab(250);

   if(vxechocheck)
   {
    etx=ttvx;
    ety=ttvy;
   }
  }
  else
  {
   oy=ttvy;
   oc=vscr->tcbuf[ety][etx];
   if(oc==95 && !fullmode)
   {
    if(!vxechocheck) fequal(etx,ety);
    tempe=vxechocheck;
    vxechocheck=0;
    sendchar(oc);
    fgrab(350);
    viewline(9);
    fgrab(25);
    viewline(8);
    fgrab(25);
    fgrab(50);
    etx=ttvx;
    ety=ttvy;
    vxechocheck=tempe;
   }
   else
   {
    sendchar(oc);
    if(vxechocheck)
    {
     etx=ttvx;
     ety=ttvy;
    } 
    else
    {
     if(++etx==40)
     {
      etx=0;
      if(++ety==24) ety=0;
     }
    }
   }
   if(scriptpoll) pollzt();
  }

  if(etx==0 && ety==0) break;
  if(!fullmode && (ety==23 || ety<oy)) break;

 } while(sendframe);

 if(fullmode && sendframe)
 {
  viewline(ESC);
  viewline('J');
 }
 
 viewconvertstringline(vxsuffix);
 closedownt(SENDFRAME);

 sendsactive=0;
}


/*****************************************************************************/

void vxgoframeref(char * mbxref)
{
 int i;
 int len;
 char c;

 len=strlen(mbxref);
 if(len==0) return;

 c=mbxref[0];
 viewline('*');
 if(c<'0' || c>'9')
 {
  for(i=0;i<len;i++) viewline(mbxref[i]);
  viewline(95);
 }
 else
 {
  for(i=0;i<10;i++)
  {
   c=mbxref[i];
   if(c>='0' && c <='9') viewline((mbxref[i]) & 0x7F);
   else break;
  }
  c=mbxref[i] & 0x5f;
  if(c>='A' && c<='Z') for(i='A';i<=c;i++) viewline(95);
 }
}



char mbxref[24];
char mbxno[64];

/* homes in on page mbxref[] */

void vxgombxref(void)
{
 vxgoframeref(mbxref);
}



void vxgetmousestring(char * string,vxscreen * vsc,int handle)
{
 int lo;
 int hi;
 int byte;
 int i;

 vxgetxyh(handle,vsc);
 hi=lo=mttvx;

 if(vsc->tcbuf[mttvy][lo]>='0' && vsc->tcbuf[mttvy][lo]<='9')
 {
  while(lo!=0)
  {
   byte=vsc->tcbuf[mttvy][lo-1];
   if(byte>='0' && byte<='9')
   {
    lo--;
   }
   else
   if(byte=='*')
   {
    lo--;
    break;
   }
   else
   {
    break;
   }
  }

  while(hi!=39)
  {
   byte=vsc->tcbuf[mttvy][hi+1];
   if(byte>='0' && byte<='9')
   {
    hi++;
   }
   else
   if(byte==95)
   {
    hi++;
    break;
   }
   else 
   {
    break;
   }
  }
 }
 else
 {
  while(lo-->0)
  {
   byte=vsc->tcbuf[mttvy][lo];
   if(byte=='*') break;
  }
  while(hi++<39)
  {
   byte=vsc->tcbuf[mttvy][hi];
   if(byte==95) break;
  }

  if(lo==-1 || hi==40) lo=hi=mttvx;
 }

 for(i=lo;i<=hi;i++)
 {
  string[i-lo]=vsc->tcbuf[mttvy][i];
 }
 string[i-lo]=0;
}




/* reply to mbx */
/* we double click on a mail box reference on screen */
/* this has to end up in mbxno                       */


void vxreplytombx(vxscreen * vsc,int handle)
{
 int  i; 

#ifdef NEVER
 int  flen;
 int  time;
 char c;
 char * f1;
#endif


 /* got to get MBX number */

 vxgetmousestring(mbxno,vsc,handle);

 if(strlen(mbxno))
 {
                                           /* remember this frame in mbxref */
  if(vscr->tcbuf[0][25]>='0' && vscr->tcbuf[0][25]<='9')
  {
   for(i=0;i<15;i++) mbxref[i]=vscr->tcbuf[0][25+i];
  }
  else
  {
   strcpy(mbxref,"NEW MESSAGES");
  }

  viewconvertstringline(vxmbxreply);


#ifdef NEVER
  f1=menuaddr(vxmbxreply_menu,0);
  flen=strlen(f1);

  if(!flen || f1[0]!='*' || f1[flen-1]!='_') f1="*71_";
  viewstringline(f1);


  time=clock()+500;

  while(clock()<time) 
  {
   tty(i=getbyte());
   if(i!=-1) time=clock()+25;
   if(scriptpoll) pollzt();
  }


  for(i=0;i<strlen(mbxno);i++)
  {
   c=mbxno[i];
   if(c<'0' || c>'9') break;
   else               viewline(c);
  }

  if(i!=0) viewline(95);

#endif

 }
}




/* used to send character or *nnnnn# sequence under pointer */

void vxsendcursorcode(vxscreen * vsc,int handle)
{
 char string[64];
 vxgetmousestring(string,vsc,handle);
 viewstringline(string);
}




/* homes cursor to mouse position */


void vxhomecursortomouse(void)
{
 int i;
 int xd;
 int yd;
 int dx;
 int dy;
 int y;
 int x;

 vxgetxy();

 y=mttvy;
 x=mttvx;

 xd=(x<ttvx);

 if(xd) dx=ttvx-x; 
 else   dx=x-ttvx;

 yd=(y<ttvy);

 if(yd) dy=ttvy-y; 
 else   dy=y-ttvy;

 for(i=0;i<dy;i++) viewintkey((0x18E)+yd);
 for(i=0;i<dx;i++) viewintkey((0x18D)-xd);
}



void vxsendreturn(void)
{
 viewintkey(CR);
}



void vxanswerback(void)
{
 viewconvertstringline(vxanswerbackstring);
}


